import matplotlib.pyplot as plt

# 从表格提取数据（数值转换为千单位）
single_label_categories = ['Emotion', 'Sound Event', 'Age', 'Gender']
single_label_samples = [145, 10, 11, 11]  # 原始数值（单位：千）
single_label_samples = [f'{x}k' for x in single_label_samples]  # 格式化带单位
single_label_samples =  ['145k', '10k', '11k', '11k']
label_type_categories = ['Single Label', 'Multi Label']
total_single_samples = sum([int(x.replace('k', '')) for x in single_label_samples])  # 计算总和
multi_label_samples = 37  # 原始数值（单位：千）
label_type_samples = [f'{total_single_samples}k', f'{multi_label_samples}k']  # 格式化带单位

# 配置字体设置
# plt.rcParams["font.family"] = ["sans-serif"]
plt.rcParams["font.family"] = ["serif"]
plt.rcParams["font.serif"] = ["Times New Roman"]
plt.rcParams["font.sans-serif"] = ["DejaVu Sans", "Bitstream Vera Sans",
                                   "Computer Modern Sans Serif", "Verdana", "Geneva"]
plt.rcParams["axes.unicode_minus"] = False

# 创建包含两个子图的图表
plt.figure(figsize=(20, 12))


# 自定义autopct函数，通过比例匹配正确索引，避免越界
def make_autopct(values, x_values):
    sum_x = sum(x_values)
    ratios = [x / sum_x for x in x_values]  # 预计算每个元素的占比
    def my_autopct(pct):
        ratio = pct / 100  # 当前扇形的占比
        # 找到与当前占比最接近的索引
        i = min(range(len(ratios)), key=lambda j: abs(ratios[j] - ratio))
        return values[i]
    return my_autopct


# 第一个子图：单标签数据分布
ax1 = plt.subplot(121)
single_x = [int(x.replace('k', '')) for x in single_label_samples]  # 原始数值列表（用于计算比例）
single_explode = [0.1 if x == max(single_x) else 0 for x in single_x]

# 绘制饼图（使用原始数值计算比例，显示带单位文本）
wedges, texts, autotexts = ax1.pie(
    single_x,
    explode=single_explode,
    labels=single_label_categories,
    autopct=make_autopct(single_label_samples, single_x),  # 传递数值列表用于索引匹配
    startangle=90,
    colors=plt.cm.Pastel1.colors,
    pctdistance=0.75
)

# 设置外部标签字体大小为30
plt.setp(texts, fontsize=40)
# 设置内部文本字体大小为20
plt.setp(autotexts, fontsize=35)

ax1.set_title('(a)', fontsize=45, y=0)

# 第二个子图：标签类型分布
ax2 = plt.subplot(122)
label_type_x = [int(x.replace('k', '')) for x in label_type_samples]  # 原始数值列表（用于计算比例）
label_type_explode = [0.1 if x == max(label_type_x) else 0 for x in label_type_x]

# 绘制饼图（使用原始数值计算比例，显示带单位文本）
wedges2, texts2, autotexts2 = ax2.pie(
    label_type_x,
    explode=label_type_explode,
    labels=label_type_categories,
    autopct=make_autopct(label_type_samples, label_type_x),  # 传递数值列表用于索引匹配
    startangle=90,
    colors=plt.cm.Pastel2.colors,
    pctdistance=0.75
)

# 设置外部标签字体大小为30
plt.setp(texts2, fontsize=40)
# 设置内部文本字体大小为20
plt.setp(autotexts2, fontsize=35)

ax2.set_title("(b)", fontsize=45, y=0)

plt.tight_layout()
plt.show()